package com.tensquare.user.service;

import com.tensquare.user.dao.UserDao;
import com.tensquare.user.pojo.User;
import org.apache.commons.lang3.StringUtils;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import util.IdWorker;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.TimeUnit;

@Service
@Transactional
public class UserService {
    @Autowired
    private UserDao userDao;
    @Autowired
    private IdWorker idWorker;
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @Autowired
    private BCryptPasswordEncoder encode;
    //1. 发送短信验证码
    public void sendSms(String mobile) {
        //1.1)生成六位数的验证码
        int min = 100000;
        int max = 999999;
        Random random = new Random();
        int i = random.nextInt(max - min);  //生成一个(max-min)范围内的随机数
        if(i < min){
            i = min + i;        //此时得到的就是一个[min,max)范围的随机数
        }
        System.out.println("验证码为 : " + i);
        //1.2 将生成的验证码放到redis中，便于验证
        redisTemplate.opsForValue().set("myvalidCode",i,5,TimeUnit.MINUTES);
        //1.3 使用rabbit给微服务后台发送这个信息
        //1.3.1 线进行封装
        Map<String,String> map = new HashMap<>();
        map.put("mobile",mobile);
        map.put("codi",i + "");
        //1.3.2 发送消息
        rabbitTemplate.convertAndSend("sms",map);

    }
    //2. 注册用户，首先将用户输入验证码与redis中验证码进行比较，一致则注册
    public boolean register(String code, User user) {
        //2.1 得到redis中的验证码
        String codes =  redisTemplate.opsForValue().get("myvalidCode") + "";
        //2.2 比较验证码是否相等
        if (StringUtils.isNotBlank(codes) && codes.equals(code)){
            user.setId( idWorker.nextId()+"" );
            user.setFollowcount(0);//关注数
            user.setFanscount(0);//粉丝数
            user.setOnline(0L);//在线时长
            user.setRegdate(new Date());//注册日期
            user.setUpdatedate(new Date());//更新日期
            user.setLastdate(new Date());//最后登陆日期
            //对用户输入的密码进行加密
            String password = encode.encode(user.getPassword());
            //设置用户密码
            user.setPassword(password);
            System.out.println("user" + user) ;
            userDao.save(user);
            return true;
        }
        return false;
    }
    //3. 用户登录
    public User login(User user) {
        //3.1 据手机号查询用户是否存在
        User loginUser = userDao.findByMobile(user.getMobile());
        if (loginUser != null && encode.matches(user.getPassword(),loginUser.getPassword()))
        {
            return loginUser;
        }
        return null;
    }
    //4. 删除用户
    public void dele(String userId) {
        userDao.deleteById(userId);

    }
    //5.修改粉丝数
    public void incFans(String userid, int x) {
        userDao.incFans(userid,x);
    }
     //6.修改关注数
    public void incFollow(String userid, int x) {
        userDao.incFollow(userid,x);
    }
}
